//
//  PhotoSelecterViewController.swift
//  照片选择器
//
//  Created by 张衡 on 15/8/13.
//  Copyright © 2015年 张衡. All rights reserved.
//


/**
逻辑： 用户点击cell中的button ,调用button的target方法，触发cell 的代理（控制器）执行代理方法来添加图片&删除图片，
      点cell 中的btn 添加图片时(cell代理方法）记录出当前item，并传出给控制器，present出uipickerviewcontroller,
      
        控制器又遵守UIPickerView的代理方法，选择照片完成之后，先修改照片大小尺寸，再判断传出的cell item 和 照片数组中照片个数大小关系， 如果相等，表示当初点击了最后一个添加图片的cell ,此时向图片数组中append,
            如果传出的cell item 小于 照片数组中照片个数，要替换数组中相应的图片，
            reloaddata collectionview
            并dismiss照片选择器


        删除：拿到索引，删除数组中图片，刷新
      。

 */



import UIKit

private let ZHPhotoSelecterCell = "ZHPhotoSelecterCell"

private let kPhotoSelectorMaxCount = 9

class PhotoSelecterViewController: UICollectionViewController, photoSelecterViewCellDelegate {

    // 照片数组
    lazy var photos: [UIImage] = [UIImage]()
    
    // 当前用户选择的照片索引
    private var currentIndex = 0
    
    init() {
        super.init(collectionViewLayout: UICollectionViewFlowLayout())
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView?.backgroundColor = UIColor.whiteColor()

        // 注册cell
        self.collectionView!.registerClass(photoSelecterViewCell.self, forCellWithReuseIdentifier: ZHPhotoSelecterCell)
        
        // 第二种方式来设置布局属性,用cellectView 导出——布局属性，来进行各种设置
        let layout = collectionView?.collectionViewLayout as! UICollectionViewFlowLayout
        
        // 提示：用户体验，屏幕越大，展现的内容应越多
        layout.itemSize = CGSize(width: 80, height: 80)
        
        layout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        
//        layout.minimumLineSpacing = 1

    }
    
    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        // return photos.count + 1
        return (photos.count == kPhotoSelectorMaxCount) ? photos.count : photos.count + 1
    }

    
    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ZHPhotoSelecterCell, forIndexPath: indexPath) as! photoSelecterViewCell
        
        cell.backgroundColor = UIColor.grayColor()
        
        // 设置代理
        cell.photoDelegate = self
        
        cell.image = (indexPath.item < photos.count) ? photos[indexPath.item] : nil
    
        return cell
    }
    
    
    // 实现协议方法, 如果协议是private， 实现的方法也是private
    // collectionViewCell 的代理方法（自己写的协议）
    private func photoSelecterViewCellRemovePhoto(cell: photoSelecterViewCell) {
        
        let indexPath = collectionView?.indexPathForCell(cell)
        
        // 删除数组中对应的图片
        photos.removeAtIndex(indexPath!.item)
        
        // 刷新
        collectionView?.reloadData()
    }
    
    // collectionViewCell 的代理方法（自己写的协议）
    private func photoSelecterViewCellSelectPhoto(cell: photoSelecterViewCell) {
        
        // 监测 源是不是支持
        /*
        case PhotoLibrary ( 默认类型 )照片库 - 所有照片，包括使用itunes 同步照片 ，不可删除
        case Camera         相机
        case SavedPhotosAlbum  交卷 - 摄像头拍摄的照片，其他应用保存的图片， 可以删除
        */
        
        // 使用图片库时，一定要加，因为是需要授权的,可显示不能访问原因-----------------0 不懂
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
            
            print("无法访问照片库")
            return
        }
        
        
        // 记录用户选中的cell 的索引
        let indexPath = collectionView?.indexPathForCell(cell)
        currentIndex = indexPath!.item
        
        
        // 实例照片选择控制器
        let picker = UIImagePickerController()
        
        picker.delegate = self
        
        // 设置允许编辑, 选择头像时，太适用了 1、 正方形 2、 图形会变小
        // picker.allowsEditing = true
        
        presentViewController(picker, animated: true, completion: nil)

    }

}


// UIImagePickerControllerDelegate  实现了代理方法后，就需要程序员自己关闭控制器
extension PhotoSelecterViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
        
        // print(image)
        
        // 在实际开发中涉及到相册都要考虑内存
        let img = image.scaleImage(300) // 统一缩放到宽300
        
        if currentIndex == photos.count {  // photos.count + 1 = cell总个数， 0.1.2.3，  photos.count和最后一个cell 的item 相等
            
            
            
            photos.append(img)
        } else {
            
            photos[currentIndex] = img
        }
        
        collectionView?.reloadData()
        dismissViewControllerAnimated(true, completion: nil)
    }
}








// 提示： 如果元素之间有非常明显的包含和被包含的关系，建议使用代理，，闭包要写一坨代码，在数据源的第三个方法中
private protocol photoSelecterViewCellDelegate: NSObjectProtocol {
    // 选择照片
    func photoSelecterViewCellSelectPhoto(cell: photoSelecterViewCell)
    // 删除照片
    func photoSelecterViewCellRemovePhoto(cell: photoSelecterViewCell)
}



 // 照片选择cell
private class photoSelecterViewCell: UICollectionViewCell {
    
    
    // cell的图像
    var image: UIImage? {
        didSet{
            
            // 判断图像是否为空
            if image == nil {
                
                photoBtn.setImage("compose_pic_add")
                
                
                
            } else {
                photoBtn.setImage(image, forState: UIControlState.Normal)
                photoBtn.setImage(nil, forState: UIControlState.Highlighted)
            }
            
            removeBtn.hidden = (image == nil)
        }
    }
    
    // 代理
    weak var photoDelegate: photoSelecterViewCellDelegate?
    
    // MARK: - 按钮监听方法 - 监听方法是通过运行循环发送消息的，如果类是 private ，访问不到
    // 两个解决办法，
    // 1. 删除类的 private
    // 2. 如果不想开放这个 类， 方法前使用一个关键字 @objc
    @objc func clickPhoto() {
        
        photoDelegate?.photoSelecterViewCellSelectPhoto(self)
    }
    
    @objc func clickRemove() {
        
        photoDelegate?.photoSelecterViewCellRemovePhoto(self)
    }
    
    
    
    // MARK: - 构造函数
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        setupUI()
        
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    private func setupUI() {
        
        addSubview(photoBtn)
        addSubview(removeBtn)
        
        // 自动布局
        photoBtn.translatesAutoresizingMaskIntoConstraints = false
        removeBtn.translatesAutoresizingMaskIntoConstraints = false
        // 注意字典的写法：曾报错过
        let dict = ["pB": photoBtn, "rB": removeBtn]
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[pB]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict))
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[pB]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict))
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[rB]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict))
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[rB]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict))
        
        
        photoBtn.addTarget(self, action: "clickPhoto", forControlEvents: UIControlEvents.TouchUpInside)
        removeBtn.addTarget(self, action: "clickRemove", forControlEvents: UIControlEvents.TouchUpInside)
        
        // 修改按钮填充模式 （老头被挤扁了）
        // photoBtn.contentMode = UIViewContentMode.ScaleAspectFill
        photoBtn.imageView?.contentMode = UIViewContentMode.ScaleAspectFill
    }
    
    
    private lazy var photoBtn : UIButton = UIButton(imageName: "compose_pic_add")
    // 不存在返回nil ，不设置高亮图片
    private lazy var removeBtn: UIButton = UIButton(imageName: "compose_photo_close")
}








